package com.dream.wukong.configcenter.client.core;

import com.alibaba.fastjson.JSONObject;
import com.google.common.collect.Maps;
import org.apache.commons.lang.StringUtils;
import org.apache.log4j.Logger;

import java.util.Map;
import java.util.Objects;

/**
* 描  述: Json格式的配置服务类
* 创建时间: 2018/5/22
*/
public class JsonConfiguration implements IConfiguration {

    private static Logger logger = Logger.getLogger(JsonConfiguration.class);
    private Map<String, RealProperty> propertys = Maps.newHashMap();


    public static JsonConfiguration getInstance() {
        return JsonConfigurationHolder.INSTANCE;
    }

    protected Object readResolve() {
        return JsonConfigurationHolder.INSTANCE;
    }

    /**
    * 描  述: 根据key 获取 对应的配置value
    * 参  数:key
    * 返回值: com.hollycrm.hollybeacons.configcenter.client.core.ProxyProperty
    * 创建时间: 2018/5/23
    */
    @Override
    public ProxyProperty getConfiguration(String key) {
        if (this.propertys.containsKey(key)) {
            return new ProxyProperty(this.propertys.get(key));
        }
        return new ProxyProperty(new RealProperty(new JSONObject()));
    }

    /**
    * 描  述: 设置配置信息，涉及更新操作
    * 参  数:configName
    * 参  数:configValue
    * 返回值: void
    * 创建时间: 2018/5/23
    */
    @Override
    public void setConfiguration(String configName, String configValue) {

        if(StringUtils.isBlank(configName) || StringUtils.isBlank(configValue)){
            return;
        }
        //// 将configValue 进行json格式转换
        JSONObject configValueJson = null;
        try {
            configValueJson = JSONObject.parseObject(configValue);
        } catch (Exception e) {
            logger.info(
                    "JsonConfiguration转换configValue成json串失败："
                            + e.getLocalizedMessage(), e);
        }
        //如果存在则对配置进行更新,否则进行新增
        if(Objects.isNull(configValueJson)){
            propertys.put(configName, new RealProperty(new JSONObject()));
        }else{
            if(propertys.containsKey(configName)){
                propertys.get(configName).setConfigValue(configValueJson);
            }else {
                propertys.put(configName, new RealProperty(configValueJson));
            }
        }
    }


    private static final class JsonConfigurationHolder {
        private static final JsonConfiguration INSTANCE = new JsonConfiguration();
    }
}
